/*!
 * \file WTSMarcos.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader系统通用宏定义文件
 */
#pragma once
#include <limits.h>
#include <string.h>

#ifndef NOMINMAX
#define NOMINMAX
#endif

/*!
 * \brief 合约代码的最大长度
 * 
 * \details 定义期货、期权等金融工具合约代码字符串的最大长度限制，
 *          用于确保字符串缓冲区的安全分配
 */
#define MAX_INSTRUMENT_LENGTH	32

/*!
 * \brief 交易所代码的最大长度
 * 
 * \details 定义交易所代码字符串的最大长度限制，
 *          如SHFE、DCE、CZCE等交易所标识符的长度约束
 */
#define MAX_EXCHANGE_LENGTH		16

/*!
 * \brief 静态类型转换宏
 * 
 * \details 封装C++的static_cast操作，提供更简洁的类型转换语法，
 *          主要用于安全的向下转型和相关类型间的转换
 * 
 * \param x 要转换的表达式或变量
 * \param T 目标类型
 */
#define STATIC_CONVERT(x,T)		static_cast<T>(x)

#ifndef DBL_MAX
/*!
 * \brief 双精度浮点数的最大值
 * 
 * \details 定义double类型可表示的最大正数值，
 *          用于数值计算的边界检查和无效值标识
 */
#define DBL_MAX 1.7976931348623158e+308
#endif

#ifndef FLT_MAX
/*!
 * \brief 单精度浮点数的最大值
 * 
 * \details 定义float类型可表示的最大正数值，
 *          用于单精度数值计算的边界检查
 */
#define FLT_MAX 3.402823466e+38F        /* max value */
#endif

#ifdef _MSC_VER
/*!
 * \brief 无效双精度浮点数标识（MSVC版本）
 * 
 * \details 使用双精度浮点数的最大值作为无效数值的标识，
 *          用于表示计算错误、数据缺失等异常状态
 */
#define INVALID_DOUBLE		DBL_MAX

/*!
 * \brief 无效32位有符号整数标识（MSVC版本）
 * 
 * \details 使用32位有符号整数的最大值作为无效数值的标识
 */
#define INVALID_INT32		INT_MAX

/*!
 * \brief 无效32位无符号整数标识（MSVC版本）
 * 
 * \details 使用32位无符号整数的最大值作为无效数值的标识
 */
#define INVALID_UINT32		UINT_MAX

/*!
 * \brief 无效64位有符号整数标识（MSVC版本）
 * 
 * \details 使用64位有符号整数的最大值作为无效数值的标识
 */
#define INVALID_INT64		_I64_MAX

/*!
 * \brief 无效64位无符号整数标识（MSVC版本）
 * 
 * \details 使用64位无符号整数的最大值作为无效数值的标识
 */
#define INVALID_UINT64		_UI64_MAX
#else
/*!
 * \brief 无效双精度浮点数标识（非MSVC版本）
 * 
 * \details 使用双精度浮点数的最大值作为无效数值的标识，
 *          用于表示计算错误、数据缺失等异常状态
 */
#define INVALID_DOUBLE		1.7976931348623158e+308 /* max value */

/*!
 * \brief 无效32位有符号整数标识（非MSVC版本）
 * 
 * \details 使用32位有符号整数的最大值作为无效数值的标识
 */
#define INVALID_INT32		2147483647

/*!
 * \brief 无效32位无符号整数标识（非MSVC版本）
 * 
 * \details 使用32位无符号整数的最大值作为无效数值的标识
 */
#define INVALID_UINT32		0xffffffffUL

/*!
 * \brief 无效64位有符号整数标识（非MSVC版本）
 * 
 * \details 使用64位有符号整数的最大值作为无效数值的标识
 */
#define INVALID_INT64		9223372036854775807LL

/*!
 * \brief 无效64位无符号整数标识（非MSVC版本）
 * 
 * \details 使用64位无符号整数的最大值作为无效数值的标识
 */
#define INVALID_UINT64		0xffffffffffffffffULL
#endif

#ifndef NULL
#ifdef __cplusplus
/*!
 * \brief 空指针定义（C++版本）
 * 
 * \details 在C++环境中将NULL定义为0，符合C++标准
 */
#define NULL 0
#else
/*!
 * \brief 空指针定义（C版本）
 * 
 * \details 在C环境中将NULL定义为void指针的0值
 */
#define NULL ((void *)0)
#endif
#endif

/*!
 * \brief WonderTrader命名空间开始宏
 * 
 * \details 开始wtp命名空间的定义，用于封装WonderTrader的所有类和函数
 */
#define NS_WTP_BEGIN	namespace wtp{

/*!
 * \brief WonderTrader命名空间结束宏
 * 
 * \details 结束wtp命名空间的定义
 */
#define NS_WTP_END	}//namespace wpt

/*!
 * \brief 使用WonderTrader命名空间宏
 * 
 * \details 引入wtp命名空间，使得可以直接使用命名空间内的类和函数
 */
#define	USING_NS_WTP	using namespace wtp

#ifndef EXPORT_FLAG
#ifdef _MSC_VER
/*!
 * \brief 动态库导出标志（MSVC版本）
 * 
 * \details 在Windows/MSVC环境下使用__declspec(dllexport)导出符号
 */
#	define EXPORT_FLAG __declspec(dllexport)
#else
/*!
 * \brief 动态库导出标志（GCC版本）
 * 
 * \details 在GCC/Clang环境下使用visibility属性导出符号
 */
#	define EXPORT_FLAG __attribute__((__visibility__("default")))
#endif
#endif

#ifndef PORTER_FLAG
#ifdef _MSC_VER
/*!
 * \brief 接口调用约定标志（MSVC版本）
 * 
 * \details 在Windows/MSVC环境下使用_cdecl调用约定
 */
#	define PORTER_FLAG _cdecl
#else
/*!
 * \brief 接口调用约定标志（非MSVC版本）
 * 
 * \details 在非Windows环境下定义为空，使用默认调用约定
 */
#	define PORTER_FLAG 
#endif
#endif

/*!
 * \brief WonderTrader无符号32位整数类型定义
 * 
 * \details 统一定义32位无符号整数类型，确保跨平台兼容性
 */
typedef unsigned long		WtUInt32;

/*!
 * \brief WonderTrader无符号64位整数类型定义
 * 
 * \details 统一定义64位无符号整数类型，确保跨平台兼容性
 */
typedef unsigned long long	WtUInt64;

/*!
 * \brief WonderTrader字符串类型定义
 * 
 * \details 统一定义常量字符串指针类型，用于接口参数传递
 */
typedef const char*			WtString;

#ifdef _MSC_VER
/*!
 * \brief 不区分大小写字符串比较宏（MSVC版本）
 * 
 * \details 在Windows/MSVC环境下映射到_stricmp函数
 */
#define wt_stricmp _stricmp
#else
/*!
 * \brief 不区分大小写字符串比较宏（POSIX版本）
 * 
 * \details 在POSIX兼容系统中映射到strcasecmp函数
 */
#define wt_stricmp strcasecmp
#endif

/*!
 * \brief 安全的字符串复制函数
 * 
 * \details 重写的strcpy函数，提供更安全的字符串复制操作。
 *          该函数相比标准strcpy具有以下优势：
 *          - 明确指定复制长度，避免缓冲区溢出
 *          - 自动添加字符串终止符
 *          - 返回实际复制的字符数量
 * 
 * \param des 目标字符串缓冲区
 * \param src 源字符串
 * \param len 要复制的字符数量，0表示复制整个源字符串
 * 
 * \return 实际复制的字符数量（不包括终止符）
 * 
 * \note 调用者需要确保目标缓冲区有足够的空间容纳复制的字符串加上终止符
 * 
 * \author Wesley
 * \date 2022.03.17
 */
inline size_t wt_strcpy(char* des, const char* src, size_t len = 0)
{
	len = (len == 0) ? strlen(src) : len;
	memcpy(des, src, len);
	des[len] = '\0';
	return len;
}